#include "actormanager.h"
#include "actor.h"

#include <algorithm>

ActorManager::ActorManager() : Manager()
{
}

ActorManager::~ActorManager()
{
  clear();
}

actorIt ActorManager::begin()
{
  return m_actualList.begin();
}

actorIt ActorManager::end()
{
  return m_actualList.end();
}

void ActorManager::clear()
{
  actorIt it=m_actualList.begin();
  for(;it!=m_actualList.end();it++)
    delete (*it);

  m_actualList.clear();
}

void ActorManager::addActor(Actor *a)
{
  m_actualList.push_back(a);
}

void ActorManager::delActor(Actor *a)
{
  m_toDeleteList.push_back(a);
}

unsigned ActorManager::size()
{
  return m_actualList.size();
}

void ActorManager::logicTick()
{
  actorIt it=m_actualList.begin();
  for(;it!=m_actualList.end();it++)
  {
    // Si esta en la lista para ser borrado
    if(find(m_toDeleteList.begin(),m_toDeleteList.end(),(*it))
          !=m_toDeleteList.end())
    {
      delete (*it);
      it=m_actualList.erase(it);
      // Como devuelve un iterador al siguiente elemento, damos un paso
      // hacia atras para que en la proxima iteracion vuelva al proximo
      // y no se lo salte
      it--;
       
      // Si no actualizamos
      continue;
    }

    (*it)->logicTick();
  }

  m_toDeleteList.clear();
}

void ActorManager::graphicTick()
{
  actorIt it=m_actualList.begin();
  for(;it!=m_actualList.end();it++)
    (*it)->graphicTick();
}
